@openrig/cli 0.3.4 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (300) hide show
  1. package/daemon/assets/plugins/openrig-core/hooks/claude.json +11 -0
  2. package/daemon/assets/plugins/openrig-core/hooks/codex.json +14 -3
  3. package/daemon/assets/plugins/openrig-core/hooks/scripts/activity-relay.cjs +34 -0
  4. package/daemon/assets/plugins/openrig-core/hooks/scripts/compaction-restore-bridge.cjs +28 -24
  5. package/daemon/assets/plugins/openrig-core/skills/claude-compaction-restore/scripts/precompact-hook.mjs +72 -11
  6. package/daemon/assets/plugins/openrig-core/skills/queue-handoff/SKILL.md +62 -29
  7. package/daemon/dist/adapters/codex-resume.d.ts +2 -1
  8. package/daemon/dist/adapters/codex-resume.d.ts.map +1 -1
  9. package/daemon/dist/adapters/codex-resume.js +18 -6
  10. package/daemon/dist/adapters/codex-resume.js.map +1 -1
  11. package/daemon/dist/adapters/codex-runtime-adapter.d.ts +37 -1
  12. package/daemon/dist/adapters/codex-runtime-adapter.d.ts.map +1 -1
  13. package/daemon/dist/adapters/codex-runtime-adapter.js +212 -6
  14. package/daemon/dist/adapters/codex-runtime-adapter.js.map +1 -1
  15. package/daemon/dist/adapters/tmux.d.ts +28 -14
  16. package/daemon/dist/adapters/tmux.d.ts.map +1 -1
  17. package/daemon/dist/adapters/tmux.js +65 -30
  18. package/daemon/dist/adapters/tmux.js.map +1 -1
  19. package/daemon/dist/db/migrations/043_resume_provenance.d.ts +3 -0
  20. package/daemon/dist/db/migrations/043_resume_provenance.d.ts.map +1 -0
  21. package/daemon/dist/db/migrations/043_resume_provenance.js +5 -0
  22. package/daemon/dist/db/migrations/043_resume_provenance.js.map +1 -0
  23. package/daemon/dist/db/migrations/044_queue_item_summary.d.ts +21 -0
  24. package/daemon/dist/db/migrations/044_queue_item_summary.d.ts.map +1 -0
  25. package/daemon/dist/db/migrations/044_queue_item_summary.js +25 -0
  26. package/daemon/dist/db/migrations/044_queue_item_summary.js.map +1 -0
  27. package/daemon/dist/domain/agent-activity-store.d.ts +11 -1
  28. package/daemon/dist/domain/agent-activity-store.d.ts.map +1 -1
  29. package/daemon/dist/domain/agent-activity-store.js +22 -2
  30. package/daemon/dist/domain/agent-activity-store.js.map +1 -1
  31. package/daemon/dist/domain/claude-compaction-enforcer.d.ts.map +1 -1
  32. package/daemon/dist/domain/claude-compaction-enforcer.js +69 -1
  33. package/daemon/dist/domain/claude-compaction-enforcer.js.map +1 -1
  34. package/daemon/dist/domain/daemon-version.d.ts +15 -0
  35. package/daemon/dist/domain/daemon-version.d.ts.map +1 -0
  36. package/daemon/dist/domain/daemon-version.js +28 -0
  37. package/daemon/dist/domain/daemon-version.js.map +1 -0
  38. package/daemon/dist/domain/native-resume-probe.d.ts +2 -1
  39. package/daemon/dist/domain/native-resume-probe.d.ts.map +1 -1
  40. package/daemon/dist/domain/native-resume-probe.js +21 -2
  41. package/daemon/dist/domain/native-resume-probe.js.map +1 -1
  42. package/daemon/dist/domain/node-cmux-service.d.ts +1 -0
  43. package/daemon/dist/domain/node-cmux-service.d.ts.map +1 -1
  44. package/daemon/dist/domain/node-cmux-service.js +29 -2
  45. package/daemon/dist/domain/node-cmux-service.js.map +1 -1
  46. package/daemon/dist/domain/node-inventory.d.ts.map +1 -1
  47. package/daemon/dist/domain/node-inventory.js +70 -46
  48. package/daemon/dist/domain/node-inventory.js.map +1 -1
  49. package/daemon/dist/domain/node-launcher.d.ts +7 -7
  50. package/daemon/dist/domain/node-launcher.d.ts.map +1 -1
  51. package/daemon/dist/domain/node-launcher.js +0 -22
  52. package/daemon/dist/domain/node-launcher.js.map +1 -1
  53. package/daemon/dist/domain/profile-resolver.d.ts +4 -5
  54. package/daemon/dist/domain/profile-resolver.d.ts.map +1 -1
  55. package/daemon/dist/domain/profile-resolver.js.map +1 -1
  56. package/daemon/dist/domain/queue-repository.d.ts +22 -0
  57. package/daemon/dist/domain/queue-repository.d.ts.map +1 -1
  58. package/daemon/dist/domain/queue-repository.js +39 -2
  59. package/daemon/dist/domain/queue-repository.js.map +1 -1
  60. package/daemon/dist/domain/restore-check-service.d.ts +14 -0
  61. package/daemon/dist/domain/restore-check-service.d.ts.map +1 -1
  62. package/daemon/dist/domain/restore-check-service.js +78 -8
  63. package/daemon/dist/domain/restore-check-service.js.map +1 -1
  64. package/daemon/dist/domain/restore-orchestrator.d.ts.map +1 -1
  65. package/daemon/dist/domain/restore-orchestrator.js +3 -3
  66. package/daemon/dist/domain/restore-orchestrator.js.map +1 -1
  67. package/daemon/dist/domain/resume-metadata-refresher.js +1 -1
  68. package/daemon/dist/domain/resume-metadata-refresher.js.map +1 -1
  69. package/daemon/dist/domain/resume-token-validation.d.ts +17 -0
  70. package/daemon/dist/domain/resume-token-validation.d.ts.map +1 -0
  71. package/daemon/dist/domain/resume-token-validation.js +46 -0
  72. package/daemon/dist/domain/resume-token-validation.js.map +1 -0
  73. package/daemon/dist/domain/rigspec-instantiator.d.ts.map +1 -1
  74. package/daemon/dist/domain/rigspec-instantiator.js +3 -6
  75. package/daemon/dist/domain/rigspec-instantiator.js.map +1 -1
  76. package/daemon/dist/domain/runtime-adapter.d.ts.map +1 -1
  77. package/daemon/dist/domain/runtime-adapter.js +1 -0
  78. package/daemon/dist/domain/runtime-adapter.js.map +1 -1
  79. package/daemon/dist/domain/scope/dot-id.d.ts +43 -0
  80. package/daemon/dist/domain/scope/dot-id.d.ts.map +1 -0
  81. package/daemon/dist/domain/scope/dot-id.js +165 -0
  82. package/daemon/dist/domain/scope/dot-id.js.map +1 -0
  83. package/daemon/dist/domain/scope/scope-audit.d.ts +38 -0
  84. package/daemon/dist/domain/scope/scope-audit.d.ts.map +1 -0
  85. package/daemon/dist/domain/scope/scope-audit.js +191 -0
  86. package/daemon/dist/domain/scope/scope-audit.js.map +1 -0
  87. package/daemon/dist/domain/scope/types.d.ts +67 -0
  88. package/daemon/dist/domain/scope/types.d.ts.map +1 -0
  89. package/daemon/dist/domain/scope/types.js +46 -0
  90. package/daemon/dist/domain/scope/types.js.map +1 -0
  91. package/daemon/dist/domain/seat-attention-reconciler.d.ts +12 -0
  92. package/daemon/dist/domain/seat-attention-reconciler.d.ts.map +1 -1
  93. package/daemon/dist/domain/seat-attention-reconciler.js +116 -88
  94. package/daemon/dist/domain/seat-attention-reconciler.js.map +1 -1
  95. package/daemon/dist/domain/session-registry.d.ts +15 -1
  96. package/daemon/dist/domain/session-registry.d.ts.map +1 -1
  97. package/daemon/dist/domain/session-registry.js +46 -4
  98. package/daemon/dist/domain/session-registry.js.map +1 -1
  99. package/daemon/dist/domain/session-transport.d.ts +10 -0
  100. package/daemon/dist/domain/session-transport.d.ts.map +1 -1
  101. package/daemon/dist/domain/session-transport.js +153 -19
  102. package/daemon/dist/domain/session-transport.js.map +1 -1
  103. package/daemon/dist/domain/skill-audit.d.ts +47 -0
  104. package/daemon/dist/domain/skill-audit.d.ts.map +1 -0
  105. package/daemon/dist/domain/skill-audit.js +218 -0
  106. package/daemon/dist/domain/skill-audit.js.map +1 -0
  107. package/daemon/dist/domain/skill-discovery.d.ts +15 -0
  108. package/daemon/dist/domain/skill-discovery.d.ts.map +1 -1
  109. package/daemon/dist/domain/skill-discovery.js +70 -0
  110. package/daemon/dist/domain/skill-discovery.js.map +1 -1
  111. package/daemon/dist/domain/skill-mirror-drift.d.ts +10 -0
  112. package/daemon/dist/domain/skill-mirror-drift.d.ts.map +1 -0
  113. package/daemon/dist/domain/skill-mirror-drift.js +24 -0
  114. package/daemon/dist/domain/skill-mirror-drift.js.map +1 -0
  115. package/daemon/dist/domain/slices/slice-detail-projector.d.ts.map +1 -1
  116. package/daemon/dist/domain/slices/slice-detail-projector.js +10 -3
  117. package/daemon/dist/domain/slices/slice-detail-projector.js.map +1 -1
  118. package/daemon/dist/domain/startup-orchestrator.js +1 -1
  119. package/daemon/dist/domain/startup-orchestrator.js.map +1 -1
  120. package/daemon/dist/domain/types.d.ts +48 -14
  121. package/daemon/dist/domain/types.d.ts.map +1 -1
  122. package/daemon/dist/domain/types.js.map +1 -1
  123. package/daemon/dist/domain/user-settings/settings-store.d.ts +1 -1
  124. package/daemon/dist/domain/user-settings/settings-store.d.ts.map +1 -1
  125. package/daemon/dist/domain/user-settings/settings-store.js +4 -0
  126. package/daemon/dist/domain/user-settings/settings-store.js.map +1 -1
  127. package/daemon/dist/domain/whoami-service.d.ts +1 -0
  128. package/daemon/dist/domain/whoami-service.d.ts.map +1 -1
  129. package/daemon/dist/domain/whoami-service.js +8 -4
  130. package/daemon/dist/domain/whoami-service.js.map +1 -1
  131. package/daemon/dist/domain/workspace/default-workspace-scaffold.d.ts +1 -0
  132. package/daemon/dist/domain/workspace/default-workspace-scaffold.d.ts.map +1 -1
  133. package/daemon/dist/domain/workspace/default-workspace-scaffold.js +25 -1
  134. package/daemon/dist/domain/workspace/default-workspace-scaffold.js.map +1 -1
  135. package/daemon/dist/index.d.ts.map +1 -1
  136. package/daemon/dist/index.js +25 -3
  137. package/daemon/dist/index.js.map +1 -1
  138. package/daemon/dist/routes/activity.d.ts.map +1 -1
  139. package/daemon/dist/routes/activity.js +29 -0
  140. package/daemon/dist/routes/activity.js.map +1 -1
  141. package/daemon/dist/routes/bundles.d.ts.map +1 -1
  142. package/daemon/dist/routes/bundles.js +1 -18
  143. package/daemon/dist/routes/bundles.js.map +1 -1
  144. package/daemon/dist/routes/health-summary.d.ts.map +1 -1
  145. package/daemon/dist/routes/health-summary.js +13 -2
  146. package/daemon/dist/routes/health-summary.js.map +1 -1
  147. package/daemon/dist/routes/queue.d.ts.map +1 -1
  148. package/daemon/dist/routes/queue.js +11 -0
  149. package/daemon/dist/routes/queue.js.map +1 -1
  150. package/daemon/dist/routes/restore-check.js +33 -2
  151. package/daemon/dist/routes/restore-check.js.map +1 -1
  152. package/daemon/dist/routes/scope-audit.d.ts +3 -0
  153. package/daemon/dist/routes/scope-audit.d.ts.map +1 -0
  154. package/daemon/dist/routes/scope-audit.js +175 -0
  155. package/daemon/dist/routes/scope-audit.js.map +1 -0
  156. package/daemon/dist/routes/sessions.d.ts.map +1 -1
  157. package/daemon/dist/routes/sessions.js +67 -3
  158. package/daemon/dist/routes/sessions.js.map +1 -1
  159. package/daemon/dist/routes/skills.d.ts.map +1 -1
  160. package/daemon/dist/routes/skills.js +43 -0
  161. package/daemon/dist/routes/skills.js.map +1 -1
  162. package/daemon/dist/routes/terminal-ws.d.ts +7 -0
  163. package/daemon/dist/routes/terminal-ws.d.ts.map +1 -0
  164. package/daemon/dist/routes/terminal-ws.js +132 -0
  165. package/daemon/dist/routes/terminal-ws.js.map +1 -0
  166. package/daemon/dist/routes/transport.d.ts +3 -1
  167. package/daemon/dist/routes/transport.d.ts.map +1 -1
  168. package/daemon/dist/routes/transport.js +26 -1
  169. package/daemon/dist/routes/transport.js.map +1 -1
  170. package/daemon/dist/routes/whoami.d.ts.map +1 -1
  171. package/daemon/dist/routes/whoami.js +5 -0
  172. package/daemon/dist/routes/whoami.js.map +1 -1
  173. package/daemon/dist/server.d.ts +6 -0
  174. package/daemon/dist/server.d.ts.map +1 -1
  175. package/daemon/dist/server.js +29 -2
  176. package/daemon/dist/server.js.map +1 -1
  177. package/daemon/dist/startup.d.ts +8 -0
  178. package/daemon/dist/startup.d.ts.map +1 -1
  179. package/daemon/dist/startup.js +41 -10
  180. package/daemon/dist/startup.js.map +1 -1
  181. package/daemon/dist/terminal/TerminalSessionBroker.d.ts +173 -0
  182. package/daemon/dist/terminal/TerminalSessionBroker.d.ts.map +1 -0
  183. package/daemon/dist/terminal/TerminalSessionBroker.js +570 -0
  184. package/daemon/dist/terminal/TerminalSessionBroker.js.map +1 -0
  185. package/daemon/specs/agents/shared/skills/core/openrig-user/SKILL.md +131 -2
  186. package/daemon/specs/agents/shared/skills/pods/orchestration-team/SKILL.md +29 -0
  187. package/dist/client.d.ts +1 -0
  188. package/dist/client.d.ts.map +1 -1
  189. package/dist/client.js +23 -0
  190. package/dist/client.js.map +1 -1
  191. package/dist/commands/auth.d.ts +11 -0
  192. package/dist/commands/auth.d.ts.map +1 -0
  193. package/dist/commands/auth.js +145 -0
  194. package/dist/commands/auth.js.map +1 -0
  195. package/dist/commands/capture.d.ts.map +1 -1
  196. package/dist/commands/capture.js +6 -6
  197. package/dist/commands/capture.js.map +1 -1
  198. package/dist/commands/config-init-workspace.d.ts.map +1 -1
  199. package/dist/commands/config-init-workspace.js +7 -4
  200. package/dist/commands/config-init-workspace.js.map +1 -1
  201. package/dist/commands/context.d.ts.map +1 -1
  202. package/dist/commands/context.js +41 -5
  203. package/dist/commands/context.js.map +1 -1
  204. package/dist/commands/down.d.ts.map +1 -1
  205. package/dist/commands/down.js +27 -0
  206. package/dist/commands/down.js.map +1 -1
  207. package/dist/commands/launch.d.ts.map +1 -1
  208. package/dist/commands/launch.js +34 -0
  209. package/dist/commands/launch.js.map +1 -1
  210. package/dist/commands/ps.d.ts.map +1 -1
  211. package/dist/commands/ps.js +361 -53
  212. package/dist/commands/ps.js.map +1 -1
  213. package/dist/commands/queue.d.ts.map +1 -1
  214. package/dist/commands/queue.js +83 -3
  215. package/dist/commands/queue.js.map +1 -1
  216. package/dist/commands/restore-check.d.ts.map +1 -1
  217. package/dist/commands/restore-check.js +80 -2
  218. package/dist/commands/restore-check.js.map +1 -1
  219. package/dist/commands/scope.d.ts.map +1 -1
  220. package/dist/commands/scope.js +747 -5
  221. package/dist/commands/scope.js.map +1 -1
  222. package/dist/commands/seat.d.ts +3 -1
  223. package/dist/commands/seat.d.ts.map +1 -1
  224. package/dist/commands/seat.js +61 -1
  225. package/dist/commands/seat.js.map +1 -1
  226. package/dist/commands/send.d.ts.map +1 -1
  227. package/dist/commands/send.js +46 -13
  228. package/dist/commands/send.js.map +1 -1
  229. package/dist/commands/skill.d.ts +4 -0
  230. package/dist/commands/skill.d.ts.map +1 -0
  231. package/dist/commands/skill.js +77 -0
  232. package/dist/commands/skill.js.map +1 -0
  233. package/dist/commands/up.d.ts.map +1 -1
  234. package/dist/commands/up.js +27 -0
  235. package/dist/commands/up.js.map +1 -1
  236. package/dist/commands/whoami.d.ts.map +1 -1
  237. package/dist/commands/whoami.js +208 -20
  238. package/dist/commands/whoami.js.map +1 -1
  239. package/dist/cross-host-executor.d.ts +1 -1
  240. package/dist/cross-host-executor.d.ts.map +1 -1
  241. package/dist/cross-host-executor.js +3 -2
  242. package/dist/cross-host-executor.js.map +1 -1
  243. package/dist/cross-host-types.d.ts +2 -0
  244. package/dist/cross-host-types.d.ts.map +1 -0
  245. package/dist/cross-host-types.js +2 -0
  246. package/dist/cross-host-types.js.map +1 -0
  247. package/dist/host-registry.d.ts +27 -5
  248. package/dist/host-registry.d.ts.map +1 -1
  249. package/dist/host-registry.js +86 -19
  250. package/dist/host-registry.js.map +1 -1
  251. package/dist/index.d.ts +1 -0
  252. package/dist/index.d.ts.map +1 -1
  253. package/dist/index.js +4 -0
  254. package/dist/index.js.map +1 -1
  255. package/dist/lib/codex-auth.d.ts +124 -0
  256. package/dist/lib/codex-auth.d.ts.map +1 -0
  257. package/dist/lib/codex-auth.js +418 -0
  258. package/dist/lib/codex-auth.js.map +1 -0
  259. package/dist/lib/scope/progress-edit.d.ts +42 -0
  260. package/dist/lib/scope/progress-edit.d.ts.map +1 -0
  261. package/dist/lib/scope/progress-edit.js +171 -0
  262. package/dist/lib/scope/progress-edit.js.map +1 -0
  263. package/dist/lib/scope/scope-audit.d.ts +38 -0
  264. package/dist/lib/scope/scope-audit.d.ts.map +1 -0
  265. package/dist/lib/scope/scope-audit.js +191 -0
  266. package/dist/lib/scope/scope-audit.js.map +1 -0
  267. package/dist/lib/scope/templates.d.ts +11 -0
  268. package/dist/lib/scope/templates.d.ts.map +1 -1
  269. package/dist/lib/scope/templates.js +22 -1
  270. package/dist/lib/scope/templates.js.map +1 -1
  271. package/dist/lib/scope/trust.d.ts +30 -0
  272. package/dist/lib/scope/trust.d.ts.map +1 -0
  273. package/dist/lib/scope/trust.js +80 -0
  274. package/dist/lib/scope/trust.js.map +1 -0
  275. package/dist/lib/scope/types.d.ts +6 -0
  276. package/dist/lib/scope/types.d.ts.map +1 -1
  277. package/dist/lib/scope/types.js +8 -0
  278. package/dist/lib/scope/types.js.map +1 -1
  279. package/dist/lib/scope-templates/backlog-deprecation.md +1 -0
  280. package/dist/lib/scope-templates/backlog-tech-debt.md +1 -0
  281. package/dist/lib/scope-templates/bug-fix.md +1 -0
  282. package/dist/lib/scope-templates/mission-brief.md +20 -0
  283. package/dist/lib/scope-templates/mission-placeholder.md +1 -0
  284. package/dist/lib/scope-templates/mission-progress.md +12 -0
  285. package/dist/lib/scope-templates/mission-release.md +1 -0
  286. package/dist/lib/scope-templates/placeholder.md +9 -0
  287. package/dist/lib/scope-templates/proof.md +17 -0
  288. package/dist/lib/scope-templates/release-feature.md +1 -0
  289. package/dist/lib/scope-templates/research.md +1 -0
  290. package/dist/lib/scope-templates/slice-progress.md +11 -0
  291. package/dist/remote-host-ops.d.ts +24 -0
  292. package/dist/remote-host-ops.d.ts.map +1 -0
  293. package/dist/remote-host-ops.js +53 -0
  294. package/dist/remote-host-ops.js.map +1 -0
  295. package/package.json +2 -1
  296. package/ui/dist/assets/index-CnqRX7A3.css +32 -0
  297. package/ui/dist/assets/index-CtL9jXFt.js +582 -0
  298. package/ui/dist/index.html +2 -2
  299. package/ui/dist/assets/index-C_Q5FczU.css +0 -1
  300. package/ui/dist/assets/index-De6vv0yO.js +0 -552
@@ -41,6 +41,17 @@
41
41
  ]
42
42
  }
43
43
  ],
44
+ "PreCompact": [
45
+ {
46
+ "hooks": [
47
+ {
48
+ "type": "command",
49
+ "command": "node \"${CLAUDE_PLUGIN_ROOT}/skills/claude-compaction-restore/scripts/precompact-hook.mjs\"",
50
+ "timeout": 30
51
+ }
52
+ ]
53
+ }
54
+ ],
44
55
  "PostCompact": [
45
56
  {
46
57
  "hooks": [
@@ -5,7 +5,7 @@
5
5
  "hooks": [
6
6
  {
7
7
  "type": "command",
8
- "command": "node \"${CODEX_PLUGIN_ROOT}/hooks/scripts/activity-relay.cjs\"",
8
+ "command": "node \"${PLUGIN_ROOT}/hooks/scripts/activity-relay.cjs\"",
9
9
  "timeout": 5
10
10
  }
11
11
  ]
@@ -16,7 +16,7 @@
16
16
  "hooks": [
17
17
  {
18
18
  "type": "command",
19
- "command": "node \"${CODEX_PLUGIN_ROOT}/hooks/scripts/activity-relay.cjs\"",
19
+ "command": "node \"${PLUGIN_ROOT}/hooks/scripts/activity-relay.cjs\"",
20
20
  "timeout": 5
21
21
  }
22
22
  ]
@@ -27,7 +27,18 @@
27
27
  "hooks": [
28
28
  {
29
29
  "type": "command",
30
- "command": "node \"${CODEX_PLUGIN_ROOT}/hooks/scripts/activity-relay.cjs\"",
30
+ "command": "node \"${PLUGIN_ROOT}/hooks/scripts/activity-relay.cjs\"",
31
+ "timeout": 5
32
+ }
33
+ ]
34
+ }
35
+ ],
36
+ "PermissionRequest": [
37
+ {
38
+ "hooks": [
39
+ {
40
+ "type": "command",
41
+ "command": "node \"${PLUGIN_ROOT}/hooks/scripts/activity-relay.cjs\"",
31
42
  "timeout": 5
32
43
  }
33
44
  ]
@@ -99,10 +99,43 @@ async function postHookPayload(payload, env = process.env) {
99
99
  }
100
100
  }
101
101
 
102
+ function buildSessionIdentityPayload(providerPayload, env = process.env, now = () => new Date()) {
103
+ if (!providerPayload || typeof providerPayload !== "object") return null;
104
+ const hookEvent = firstString(
105
+ providerPayload.hookEvent, providerPayload.hookEventName,
106
+ providerPayload.hook_event_name, providerPayload.event, providerPayload.eventName
107
+ );
108
+ if (!hookEvent || hookEvent.toLowerCase() !== "sessionstart") return null;
109
+
110
+ const sessionId = firstString(providerPayload.session_id, providerPayload.sessionId);
111
+ if (!sessionId) return null;
112
+
113
+ const sessionName = firstString(env.OPENRIG_SESSION_NAME, env.RIGGED_SESSION_NAME);
114
+ const nodeId = firstString(env.OPENRIG_NODE_ID, env.RIGGED_NODE_ID);
115
+ const runtime = firstString(env.OPENRIG_RUNTIME, env.RIGGED_RUNTIME);
116
+
117
+ if ((!sessionName && !nodeId) || !runtime) return null;
118
+
119
+ return {
120
+ eventFamily: "session_identity",
121
+ sessionName,
122
+ nodeId,
123
+ runtime,
124
+ hookEvent,
125
+ sessionId,
126
+ occurredAt: now().toISOString(),
127
+ };
128
+ }
129
+
102
130
  async function main() {
103
131
  const providerPayload = parseJson(await readStdin());
104
132
  const payload = buildOpenRigPayload(providerPayload);
105
133
  await postHookPayload(payload);
134
+
135
+ const identityPayload = buildSessionIdentityPayload(providerPayload, process.env);
136
+ if (identityPayload) {
137
+ await postHookPayload(identityPayload);
138
+ }
106
139
  }
107
140
 
108
141
  if (require.main === module) {
@@ -111,6 +144,7 @@ if (require.main === module) {
111
144
 
112
145
  module.exports = {
113
146
  buildOpenRigPayload,
147
+ buildSessionIdentityPayload,
114
148
  parseJson,
115
149
  postHookPayload,
116
150
  };
@@ -1,12 +1,16 @@
1
1
  #!/usr/bin/env node
2
2
  "use strict";
3
3
 
4
- // OpenRig Claude compaction restore bridge.
4
+ // OpenRig Claude compaction restore bridge (reader/deliverer).
5
5
  //
6
- // PreCompact writes a pending marker under OPENRIG_HOME. SessionStart
7
- // (matcher=compact) and UserPromptSubmit can then inject one restore
8
- // directive into Claude context via hookSpecificOutput.additionalContext.
9
- // PostCompact uses the same script as a cheap marker timestamp hook.
6
+ // The per-seat pending marker is WRITTEN on PreCompact by the product-plugin
7
+ // writer skills/claude-compaction-restore/scripts/precompact-hook.mjs (which
8
+ // generates the restore packet and persists the real outputDir + operator
9
+ // message). This bridge READS that marker on SessionStart (matcher=compact)
10
+ // and UserPromptSubmit and injects ONE restore directive into Claude context
11
+ // via hookSpecificOutput.additionalContext. PostCompact is a cheap marker
12
+ // timestamp hook. OPR.0.4.1.09: resolve ONLY this seat's marker (never deliver
13
+ // another seat's restore state) and surface the per-seat restore-map pointer.
10
14
 
11
15
  const fs = require("node:fs");
12
16
  const os = require("node:os");
@@ -76,26 +80,21 @@ function readMarker(filePath) {
76
80
  }
77
81
 
78
82
  function findMarker(payload, env = process.env) {
79
- const dir = markerDir(env);
83
+ // OPR.0.4.1.09 (never deliver wrong-seat state): resolve ONLY this seat's keyed marker.
84
+ // The previous fallback-to-newest handed a seat with NO marker the NEWEST marker on
85
+ // disk - which can be ANOTHER seat's (the reader-side parallel of the part-1 extra bug).
86
+ // No seat identity -> no marker; absence -> the loud JSONL fallback the restore prompt
87
+ // already describes, NEVER a wrong-seat guess.
80
88
  const key = sessionKey(payload, env);
81
- if (key) {
82
- const direct = readMarker(path.join(dir, `${key}.json`));
83
- if (direct) return direct;
84
- }
85
- try {
86
- const candidates = fs.readdirSync(dir)
87
- .filter((name) => name.endsWith(".json"))
88
- .map((name) => path.join(dir, name))
89
- .map((filePath) => ({ filePath, stat: fs.statSync(filePath) }))
90
- .sort((a, b) => b.stat.mtimeMs - a.stat.mtimeMs);
91
- for (const candidate of candidates) {
92
- const marker = readMarker(candidate.filePath);
93
- if (marker) return marker;
94
- }
95
- } catch {
96
- return null;
97
- }
98
- return null;
89
+ if (!key) return null;
90
+ const marker = readMarker(path.join(markerDir(env), `${key}.json`));
91
+ if (!marker) return null;
92
+ // Defense-in-depth: refuse a keyed marker that DECLARES a different seat.
93
+ const declaredName = marker.data && typeof marker.data.sessionName === "string"
94
+ ? marker.data.sessionName.trim()
95
+ : "";
96
+ if (declaredName && sanitizeKey(declaredName) !== key) return null;
97
+ return marker;
99
98
  }
100
99
 
101
100
  function writeMarker(marker) {
@@ -106,6 +105,7 @@ function buildRestoreContext(marker) {
106
105
  const outputDir = firstString(marker.data.outputDir) || "/tmp/claude-compaction-restore";
107
106
  const ack = firstString(marker.data.expectedAck) || "restored from packet at <path>; resumed at step <X>";
108
107
  const postInstruction = firstString(marker.data.postCompactInstruction);
108
+ const restoreMapPath = firstString(marker.data.restoreMapPath);
109
109
  const pieces = [
110
110
  "OpenRig compaction restore packet is available for this Claude session.",
111
111
  "This hook output is informational context, not the action request.",
@@ -113,6 +113,10 @@ function buildRestoreContext(marker) {
113
113
  "OpenRig may send a later normal user message asking you to restore from this packet. Treat that later normal user message as the operator-authorized action request.",
114
114
  `After restoration, reply with: ${ack}`,
115
115
  ];
116
+ if (restoreMapPath) {
117
+ // OPR.0.4.1.09: the per-seat restore-map pointer the marker carries.
118
+ pieces.push(`Per-seat restore map: ${restoreMapPath} — read it during restore.`);
119
+ }
116
120
  if (postInstruction) {
117
121
  pieces.push(`Operator post-compaction context: ${postInstruction}`);
118
122
  }
@@ -41,6 +41,10 @@ function readInstructionFile(filePath) {
41
41
  return fs.readFileSync(expanded, "utf8");
42
42
  }
43
43
 
44
+ function sanitizeKey(value) {
45
+ return value.replace(/[^a-zA-Z0-9_.@-]/g, "_");
46
+ }
47
+
44
48
  function sessionKey(input) {
45
49
  const raw = [
46
50
  process.env.OPENRIG_SESSION_NAME,
@@ -51,13 +55,65 @@ function sessionKey(input) {
51
55
  input.sessionName,
52
56
  input.transcript_path ? path.basename(input.transcript_path, ".jsonl") : "",
53
57
  ].find((value) => typeof value === "string" && value.trim().length > 0) || "unknown-session";
54
- return raw.replace(/[^a-zA-Z0-9_.@-]/g, "_");
58
+ return sanitizeKey(raw);
59
+ }
60
+
61
+ // OPR.0.4.1.09 (rev1-r2 hook-path leak fix): MUST match claude-compaction-enforcer.ts
62
+ // declaredSeatOf EXACTLY — a seat is authoritative ONLY inside a WELL-FORMED leading
63
+ // frontmatter fence (opened AND closed `---`); the body is NEVER scanned; malformed/absent
64
+ // frontmatter -> null (generic). Duplicated (not imported) because this hook is a standalone
65
+ // portable plugin asset that cannot import the compiled daemon TS; semantics are kept
66
+ // identical so the enforcer and hook paths refuse wrong-seat extras the same way.
67
+ function declaredSeatOf(content) {
68
+ const fm = /^\s*---\s*\n([\s\S]*?)\n---/.exec(content);
69
+ if (!fm) return null;
70
+ const m = /^[ \t]*(?:target[_-]?seat|seat|session(?:[_-]?name)?)[ \t]*:[ \t]*["']?([^"'\n#]+?)["']?[ \t]*$/im.exec(fm[1]);
71
+ return m ? m[1].trim() : null;
72
+ }
73
+
74
+ // OPR.0.4.1.09 (rev1-r2): resolve the seat-safe EXTRA-FILE CONTENT for
75
+ // postCompactInstruction, mirroring the enforcer resolvePostCompactExtra: (1) prefer the
76
+ // PER-SEAT extra post-compact-extra/<seat>.md; (2) else the GLOBAL messageFilePath. In
77
+ // EITHER case a file whose WELL-FORMED frontmatter declares a DIFFERENT seat is REFUSED
78
+ // (returns "") so a foreign-seat extra never leaks into the marker via the hook path
79
+ // (the enforcer path already refused it). Generic/this-seat/malformed -> inject.
80
+ function readSeatSafeExtraFile(input, globalFilePath) {
81
+ const seatKey = sessionKey(input);
82
+ const refusedIfForeign = (content) => {
83
+ const declared = declaredSeatOf(content);
84
+ return declared && sanitizeKey(declared) !== seatKey ? "" : content;
85
+ };
86
+ // 1. Per-seat extra preferred (seat-keyed path; still defensively seat-checked to match
87
+ // the enforcer, which refuses a per-seat file declaring a different seat).
88
+ const perSeatPath = path.join(getOpenRigHome(), "compaction", "post-compact-extra", `${seatKey}.md`);
89
+ if (fs.existsSync(perSeatPath)) {
90
+ return refusedIfForeign(fs.readFileSync(perSeatPath, "utf8"));
91
+ }
92
+ // 2. Global messageFilePath fallback, seat-checked.
93
+ if (!globalFilePath) return "";
94
+ const content = readInstructionFile(globalFilePath);
95
+ if (!content) return "";
96
+ return refusedIfForeign(content);
55
97
  }
56
98
 
57
99
  function pendingMarkerPath(input) {
58
100
  return path.join(getOpenRigHome(), "compaction", "restore-pending", `${sessionKey(input)}.json`);
59
101
  }
60
102
 
103
+ // OPR.0.4.1.09: pointer to this seat's per-seat post-compaction extra
104
+ // (compaction/post-compact-extra/<seat>.md), surfaced by the bridge reader.
105
+ // Returned ONLY when it EXISTS, so the marker never points at an unresolvable
106
+ // restoreMapPath; null otherwise.
107
+ function perSeatRestoreMapPath(input) {
108
+ const p = path.join(getOpenRigHome(), "compaction", "post-compact-extra", `${sessionKey(input)}.md`);
109
+ try {
110
+ fs.accessSync(p);
111
+ return p;
112
+ } catch {
113
+ return null;
114
+ }
115
+ }
116
+
61
117
  function writePendingRestoreMarker(input, parsed, restoreInstruction, customMessage) {
62
118
  const markerPath = pendingMarkerPath(input);
63
119
  fs.mkdirSync(path.dirname(markerPath), { recursive: true });
@@ -74,6 +130,8 @@ function writePendingRestoreMarker(input, parsed, restoreInstruction, customMess
74
130
  expectedAck: "restored from packet at <path>; resumed at step <X>",
75
131
  deliveredAt: null,
76
132
  deliveryCount: 0,
133
+ // OPR.0.4.1.09: per-seat restore-map pointer (post-compact-extra/<seat>.md) or null.
134
+ restoreMapPath: perSeatRestoreMapPath(input),
77
135
  };
78
136
  fs.writeFileSync(markerPath, `${JSON.stringify(payload, null, 2)}\n`, "utf8");
79
137
  return markerPath;
@@ -86,7 +144,7 @@ function writePendingRestoreMarker(input, parsed, restoreInstruction, customMess
86
144
  // enabled but restore text has not been written yet, use OpenRig's default
87
145
  // instruction to load the canonical restore skill. Inline instructions and
88
146
  // file-path content are both included when both are configured.
89
- function readClaudeCompactionMessage() {
147
+ function readClaudeCompactionMessage(input) {
90
148
  const configPath = path.join(getOpenRigHome(), "config.json");
91
149
  let inline = "";
92
150
  let filePath = "";
@@ -115,17 +173,20 @@ function readClaudeCompactionMessage() {
115
173
 
116
174
  const parts = [];
117
175
  if (inline && inline.length > 0) {
176
+ // Inline has no file/seat to declare; keep as-is.
118
177
  parts.push(`Inline restore instruction:\n${inline}`);
119
178
  }
120
- if (filePath && filePath.length > 0) {
121
- try {
122
- const fileText = readInstructionFile(filePath);
123
- if (fileText) {
124
- parts.push(`Additional restore instruction file (${filePath}):\n${fileText}`);
125
- }
126
- } catch {
127
- // Keep any inline instruction; unreadable extra files degrade quietly.
179
+ // OPR.0.4.1.09 (rev1-r2): the FILE portion is SEAT-SAFE — per-seat extra preferred, a
180
+ // foreign-seat global refused (mirrors the enforcer). Checked even when messageFilePath
181
+ // is unset, because the per-seat extra is an independent mechanism (the enforcer also
182
+ // checks the per-seat path regardless of the global config).
183
+ try {
184
+ const fileText = readSeatSafeExtraFile(input, filePath);
185
+ if (fileText) {
186
+ parts.push(`Additional restore instruction file:\n${fileText}`);
128
187
  }
188
+ } catch {
189
+ // Keep any inline instruction; unreadable extra files degrade quietly.
129
190
  }
130
191
  if (parts.length > 0) return parts.join("\n\n");
131
192
  if (policyEnabled && !inlineConfigured && !filePathConfigured) {
@@ -147,7 +208,7 @@ try {
147
208
  args.push(input.transcript_path);
148
209
  }
149
210
 
150
- const customMessage = readClaudeCompactionMessage();
211
+ const customMessage = readClaudeCompactionMessage(input);
151
212
 
152
213
  const result = spawnSync("node", args, { encoding: "utf8" });
153
214
  if (result.status !== 0) {
@@ -1,24 +1,19 @@
1
1
  ---
2
2
  name: queue-handoff
3
- description: Use when ending a turn, finishing a slice, blocked on another agent's work, or escalating to a human — durable work handoff via queue items so the system keeps moving across compactions, missed messages, and interruptions. Covers the hot-potato terminal-turn-rule (active work ends by passing the ball, not by going idle), default-nudge semantics, and when --no-nudge or --notify is required.
3
+ description: Use when ending a turn, finishing a slice, blocked on another agent's work, or escalating to a human — durable work handoff via queue items so the system keeps moving across compactions, missed messages, and interruptions. Covers the hot-potato terminal-turn-rule (active work ends by passing the ball, not by going idle), default-nudge semantics, and when `--no-nudge` is appropriate for intentional cold park or human gate.
4
4
  metadata:
5
5
  openrig:
6
6
  stage: factory-approved
7
- last_verified: "2026-05-04"
7
+ last_verified: "2026-06-24"
8
8
  distribution_scope: product-bound
9
9
  source_evidence: |
10
- Daemon-backed `rig queue` shipped in v0.2.0 (PL-004 Phase A) with handed-off-to / handed-off-from / state field shape. `rig queue` is canonical for new work; `rigx queue` is recovery-only fallback. The daemon enforces hot-potato strict-rejection at the API.
10
+ Daemon-backed `rig queue` shipped in v0.2.0 (PL-004 Phase A) with handed-off-to / handed-off-from / state field shape. `rig queue` is canonical for new work; `rigx queue` is recovery-only fallback. The daemon enforces hot-potato strict-rejection at the API. Body resynced from canonical 2026-06-24 (demo-blocker fix: corrected the default-nudge guidance — the default already nudges; the previously-described extra notify flag does not exist on the shipped CLI).
11
11
  sibling_skills: []
12
12
  transfer_test: pending
13
13
  ---
14
14
 
15
15
  # Queue Handoff
16
16
 
17
- > **CANONICAL SURFACE NOTE (2026-05-11)** — `rig queue` (daemon-backed SQLite) is the
18
- > canonical surface for all substantive work routing. `rigx queue` (filesystem v0
19
- > prototype) is **recovery-only fallback**; qitems written via `rigx queue` are
20
- > invisible to daemon-backed reads and break fleet-wide routing discipline.
21
-
22
17
  Durable work handoff via queue items. Lets the system keep moving
23
18
  through compactions, missed messages, and interruptions by passing the
24
19
  ball forward instead of leaving work suspended in chat or in-flight
@@ -71,27 +66,64 @@ every surface (CLI, MCP, future UI) inherits the same guarantee.
71
66
  |---|---|---|
72
67
  | `rig queue create` | yes | New qitem created from scratch |
73
68
  | `rig queue handoff` | yes | Transactional close-as-handed-off + create-new |
74
- | `rig queue handoff-and-complete` | **no requires `--notify`** | Inside a self-driving loop where motion matters |
75
- | `rigx queue handoff` (filesystem v0 prototype; **recovery-only fallback since 2026-05-11**) | yes | Legacy artifact; qitems invisible to daemon-backed reads. Use `rig queue handoff` for all new substantive work. |
76
-
77
- **Footgun**: `handoff-and-complete` is cold unless `--notify` is passed.
78
- In a self-driving loop, an agent that closes with
79
- `handoff-and-complete` (no `--notify`) writes a durable qitem but does
80
- NOT wake the next ownerthe rig stalls silently while the qitem sits
81
- in inbox.
82
-
83
- **Rule**: in a live loop, use `handoff-and-complete --notify` OR send
84
- a separate verified manual nudge. `--no-nudge` exists but should be
85
- used intentionally (e.g., explicit park or human-gate signal), not as
86
- an accidental stall.
87
-
88
- ## Failure modes (5; verbatim)
69
+ | `rig queue handoff-and-complete` | yes | Atomic close + create-new; default nudge wakes the new owner |
70
+ | `rigx queue handoff` (filesystem v0 prototype; **recovery-only fallback since 2026-05-11**) | yes | Legacy artifact; qitems invisible to daemon-backed reads; deprecated with removal queued. Use `rig queue handoff` (daemon-backed) for all new substantive work. |
71
+
72
+ **Footgun**: `--no-nudge` accidentally added to a live-loop handoff.
73
+ The shipped 0.3.1 CLI nudges by default on every queue write surface
74
+ (`rig queue create`, `rig queue handoff`, AND `rig queue handoff-and-complete`).
75
+ The only suppression flag is `--no-nudge` appropriate for intentional
76
+ cold park, human-gate signal, or a deliberate poll-driven workflow, but
77
+ NOT for live-loop handoffs where motion matters.
78
+
79
+ **Rule**: in a live loop, omit `--no-nudge` and trust the default.
80
+ `--no-nudge` is the opt-out, not the opt-in. If you find yourself
81
+ reaching for `--notify`, stop — that flag does not exist on the
82
+ shipped 0.3.1 CLI; you may be following a stale instruction that
83
+ inverted the default-nudge polarity.
84
+
85
+ ## Queue-body hygiene (token + parse safety)
86
+
87
+ The qitem body is durable DATA the daemon stores and replays on every
88
+ `rig queue show <id>` / `--json` read. Keep it small and parse-safe — a
89
+ bloated or malformed body costs every future reader, not just the
90
+ recipient.
91
+
92
+ - **No large command output in bodies.** Do NOT paste `rig ps`/`--nodes`
93
+ dumps, big JSON blobs, full proof output, diffs, or transcript chunks
94
+ into a qitem body. **Link the artifact PATH** (e.g.
95
+ `missions/<m>/<slice>/proof.md`) or **summarize in prose**, then point
96
+ at the file for the detail. A pasted dump makes `rig queue show <id>
97
+ --json` huge — a second-order token bloat: bloated DATA living in the
98
+ queue, distinct from the command-default output bombs the token-burn
99
+ emergency pack covers. (Sensor: dev1-guard token-burn-flag 8ea201e4,
100
+ 2026-06; founder-directed cure.)
101
+ - **Substantive bodies go through `--body-file`, not inline `--body`.**
102
+ For anything beyond a short line, write the body to a file and pass
103
+ `--body-file <path>` (or `-` for stdin). Inline `--body` with shell
104
+ metacharacters is fragile.
105
+ - **No raw backticks in bodies.** Backticks in an inline body are shell
106
+ command-substitution and corrupt the payload (or execute). If you need
107
+ code/command spans, use `--body-file`, or drop the backticks and write
108
+ the command in plain text.
109
+
110
+ Heuristic: if the thing you want to include is more than a few lines or
111
+ contains shell metacharacters (backticks, `$`, quotes, newlines-with-pipes),
112
+ it belongs in a file you LINK, not in the body you paste.
113
+
114
+ Product backstop (defense-in-depth, NOT a substitute for this discipline):
115
+ `rig queue show` oversized-body truncation/preview is tracked separately
116
+ as slice OPR.0.4.1.3. The behavioral rule here is the primary, durable
117
+ cure; the product truncation is the safety net.
118
+
119
+ ## Failure modes (6; verbatim)
89
120
 
90
121
  1. Agent ends a turn without a handoff, so the rig appears idle.
91
- 2. Agent creates a queue item but suppresses or forgets the nudge when immediate motion was intended. This includes `handoff-and-complete` without `--notify` inside a live loop.
122
+ 2. Agent creates a queue item with `--no-nudge` inside a live loop, intending suppression of attention but breaking immediate motion. `--no-nudge` is for intentional cold park / human gate, not for routine live-loop handoffs. The opposite footgun — adding a `--notify` flag that does not exist on the shipped 0.3.1 CLI — comes from following stale instructions; the default already nudges.
92
123
  3. Queue item is too small and turns work into bureaucracy.
93
124
  4. Queue item is too broad and loses ownership, proof, or closure criteria.
94
125
  5. Human escalation happens in chat but not as a durable attention item.
126
+ 6. Agent pastes a large command dump (ps/nodes, big JSON, proof blob) into the qitem body, bloating the stored DATA so every future `rig queue show --json` read is huge. Link the proof PATH or summarize in prose; substantive bodies go through `--body-file`; no raw backticks inline.
95
127
 
96
128
  ## Durable handoff field shape
97
129
 
@@ -102,16 +134,16 @@ Every qitem carries:
102
134
  - `state` — one of: `pending | in-progress | done | blocked | failed | denied | canceled | handed-off`
103
135
  - `closure_reason` + `closure_target` — set on terminal closure per hot-potato rule
104
136
 
105
- The same field shape exists in legacy `rigx queue` artifacts and the daemon-shipped
106
- `rig queue` surface, but new queue reads and writes should use `rig queue`. Watchdog
107
- policies and workflow runtime project new owners off these fields.
137
+ The fields are auditable across both `rigx queue` (config-layer) and
138
+ `rig queue` (daemon-shipped) surfaces. Watchdog policies and workflow
139
+ runtime project new owners off these fields.
108
140
 
109
141
  ## Two surfaces (same shape)
110
142
 
111
143
  | Surface | Status | When to use |
112
144
  |---|---|---|
113
145
  | `rig queue ...` (daemon-shipped, v0.2.0) | Active host coordination surface | Daemon-backed PL-004 work; SQLite-canonical |
114
- | `rigx queue ...` (filesystem v0 prototype) | Recovery-only fallback | Legacy recovery for artifacts that have not migrated; not for new substantive work because daemon-backed reads cannot see those qitems |
146
+ | `rigx queue ...` (config-layer dogfood) | Coexists with daemon | Workflows still operating on the temporary substrate coordination layer; legacy artifacts |
115
147
 
116
148
  Default posture: prefer daemon `rig queue` for new work. If a
117
149
  daemon-backed coordination command fails, debug the command/runtime/schema
@@ -119,4 +151,5 @@ edge directly — don't fall back to stale pre-upgrade assumptions.
119
151
 
120
152
  ## See also
121
153
 
122
- - `rig queue --help` full CLI surface for queue items, handoffs, and closure-reason discipline
154
+ - `looping-workflows` skilloperating discipline for self-driving rig-shaped loops; queue-handoff is its current handoff substrate
155
+ - `intake-routing` skill — how raw signals enter the system and become routed work that flows through the queue
@@ -5,13 +5,14 @@ interface CodexResumeOptions {
5
5
  pollMs?: number;
6
6
  maxWaitMs?: number;
7
7
  sleep?: (ms: number) => Promise<void>;
8
+ exec?: (cmd: string) => Promise<string>;
8
9
  }
9
10
  export declare class CodexResumeAdapter {
10
11
  private tmux;
11
12
  private options;
12
13
  constructor(tmux: TmuxAdapter, options?: CodexResumeOptions);
13
14
  canResume(resumeType: string | null, resumeToken: string | null): boolean;
14
- resume(tmuxSessionName: string, resumeType: string | null, resumeToken: string | null, _cwd: string): Promise<ResumeResult>;
15
+ resume(tmuxSessionName: string, resumeType: string | null, resumeToken: string | null, _cwd: string, codexConfigProfile?: string | null): Promise<ResumeResult>;
15
16
  private verifyResume;
16
17
  }
17
18
  //# sourceMappingURL=codex-resume.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"codex-resume.d.ts","sourceRoot":"","sources":["../../src/adapters/codex-resume.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAOvD,OAAO,EAAE,KAAK,YAAY,EAAE,CAAC;AAE7B,UAAU,kBAAkB;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACvC;AAED,qBAAa,kBAAkB;IAE3B,OAAO,CAAC,IAAI;IACZ,OAAO,CAAC,OAAO;gBADP,IAAI,EAAE,WAAW,EACjB,OAAO,GAAE,kBAAuB;IAG1C,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO;IASnE,MAAM,CACV,eAAe,EAAE,MAAM,EACvB,UAAU,EAAE,MAAM,GAAG,IAAI,EACzB,WAAW,EAAE,MAAM,GAAG,IAAI,EAC1B,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,YAAY,CAAC;YA+BV,YAAY;CAuE3B"}
1
+ {"version":3,"file":"codex-resume.d.ts","sourceRoot":"","sources":["../../src/adapters/codex-resume.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAMvD,OAAO,EAAE,KAAK,YAAY,EAAE,CAAC;AAE7B,UAAU,kBAAkB;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;CACzC;AAED,qBAAa,kBAAkB;IAE3B,OAAO,CAAC,IAAI;IACZ,OAAO,CAAC,OAAO;gBADP,IAAI,EAAE,WAAW,EACjB,OAAO,GAAE,kBAAuB;IAG1C,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO;IASnE,MAAM,CACV,eAAe,EAAE,MAAM,EACvB,UAAU,EAAE,MAAM,GAAG,IAAI,EACzB,WAAW,EAAE,MAAM,GAAG,IAAI,EAC1B,IAAI,EAAE,MAAM,EACZ,kBAAkB,CAAC,EAAE,MAAM,GAAG,IAAI,GACjC,OAAO,CAAC,YAAY,CAAC;YAiDV,YAAY;CAuE3B"}
@@ -1,6 +1,5 @@
1
1
  import { setTimeout as sleep } from "node:timers/promises";
2
- import { shellQuote } from "./shell-quote.js";
3
- import { assessNativeResumeProbe } from "../domain/native-resume-probe.js";
2
+ import { assessNativeResumeProbe, buildCodexResumeCore } from "../domain/native-resume-probe.js";
4
3
  const CODEX_TYPES = new Set(["codex_id", "codex_last"]);
5
4
  const SHELL_COMMANDS = new Set(["bash", "fish", "nu", "sh", "tmux", "zsh"]);
6
5
  export class CodexResumeAdapter {
@@ -21,13 +20,26 @@ export class CodexResumeAdapter {
21
20
  return false;
22
21
  return true;
23
22
  }
24
- async resume(tmuxSessionName, resumeType, resumeToken, _cwd) {
23
+ async resume(tmuxSessionName, resumeType, resumeToken, _cwd, codexConfigProfile) {
25
24
  if (!this.canResume(resumeType, resumeToken)) {
26
25
  return { ok: false, code: "no_resume", message: "Codex resume not available" };
27
26
  }
28
- const cmd = resumeType === "codex_last"
29
- ? "codex resume --last"
30
- : `codex resume ${shellQuote(resumeToken)}`;
27
+ if (codexConfigProfile?.trim()) {
28
+ const { verifyCodexProfileLoads } = await import("../domain/codex-profile-preflight.js");
29
+ const execFn = this.options.exec ?? (async (cmd) => {
30
+ const { execSync } = await import("node:child_process");
31
+ return execSync(cmd, { encoding: "utf-8", stdio: ["pipe", "pipe", "pipe"], timeout: 10_000 });
32
+ });
33
+ const probeResult = await verifyCodexProfileLoads(codexConfigProfile, execFn);
34
+ if (!probeResult.ok) {
35
+ return {
36
+ ok: false,
37
+ code: "resume_failed",
38
+ message: `Profile preflight failed: ${probeResult.error}${probeResult.migrationHint ? `\n Fix: ${probeResult.migrationHint}` : ""}`,
39
+ };
40
+ }
41
+ }
42
+ const cmd = buildCodexResumeCore(resumeToken ?? "", codexConfigProfile, resumeType === "codex_last");
31
43
  const textResult = await this.tmux.sendText(tmuxSessionName, cmd);
32
44
  if (!textResult.ok) {
33
45
  // sendText failed — nothing in the buffer, no cleanup needed
@@ -1 +1 @@
1
- {"version":3,"file":"codex-resume.js","sourceRoot":"","sources":["../../src/adapters/codex-resume.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,IAAI,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAG3D,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,uBAAuB,EAAE,MAAM,kCAAkC,CAAC;AAE3E,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC,CAAC;AACxD,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;AAU5E,MAAM,OAAO,kBAAkB;IAEnB;IACA;IAFV,YACU,IAAiB,EACjB,UAA8B,EAAE;QADhC,SAAI,GAAJ,IAAI,CAAa;QACjB,YAAO,GAAP,OAAO,CAAyB;IACvC,CAAC;IAEJ,SAAS,CAAC,UAAyB,EAAE,WAA0B;QAC7D,IAAI,CAAC,UAAU,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC;YAAE,OAAO,KAAK,CAAC;QAC9D,mCAAmC;QACnC,IAAI,UAAU,KAAK,YAAY;YAAE,OAAO,IAAI,CAAC;QAC7C,yBAAyB;QACzB,IAAI,CAAC,WAAW;YAAE,OAAO,KAAK,CAAC;QAC/B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,MAAM,CACV,eAAuB,EACvB,UAAyB,EACzB,WAA0B,EAC1B,IAAY;QAEZ,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,WAAW,CAAC,EAAE,CAAC;YAC7C,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,4BAA4B,EAAE,CAAC;QACjF,CAAC;QAED,MAAM,GAAG,GAAG,UAAU,KAAK,YAAY;YACrC,CAAC,CAAC,qBAAqB;YACvB,CAAC,CAAC,gBAAgB,UAAU,CAAC,WAAY,CAAC,EAAE,CAAC;QAE/C,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC;QAClE,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC;YACnB,6DAA6D;YAC7D,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,UAAU,CAAC,OAAO,EAAE,CAAC;QAC3E,CAAC;QAED,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,eAAe,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;QACvE,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC;YAClB,mEAAmE;YACnE,4DAA4D;YAC5D,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,eAAe,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;YACnD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,SAAS,CAAC,OAAO,EAAE,CAAC;QAC1E,CAAC;QAED,OAAO,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC,CAAC;IAC5C,CAAC;IAED,0EAA0E;IAC1E,2EAA2E;IAC3E,sEAAsE;IACtE,uEAAuE;IACvE,uEAAuE;IAC/D,KAAK,CAAC,YAAY,CAAC,eAAuB;QAChD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,GAAG,CAAC;QAC1C,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,KAAK,CAAC;QAClD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,KAAK,CAAC;QAC5C,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAE9E,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,QAAQ,EAAE,OAAO,EAAE,EAAE,CAAC;YACpD,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC;YACpE,MAAM,WAAW,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YACpF,MAAM,KAAK,GAAG,uBAAuB,CAAC;gBACpC,OAAO,EAAE,OAAO;gBAChB,WAAW;gBACX,WAAW;aACZ,CAAC,CAAC;YAEH,IAAI,KAAK,CAAC,IAAI,KAAK,kBAAkB,EAAE,CAAC;gBACtC,OAAO;oBACL,EAAE,EAAE,KAAK;oBACT,IAAI,EAAE,aAAa;oBACnB,OAAO,EAAE,qEAAqE;iBAC/E,CAAC;YACJ,CAAC;YAED,uEAAuE;YACvE,uEAAuE;YACvE,uEAAuE;YACvE,qEAAqE;YACrE,IAAI,KAAK,CAAC,MAAM,KAAK,oBAAoB,EAAE,CAAC;gBAC1C,OAAO;oBACL,EAAE,EAAE,KAAK;oBACT,IAAI,EAAE,oBAAoB;oBAC1B,OAAO,EAAE,KAAK,CAAC,MAAM;oBACrB,QAAQ,EAAE,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;iBACxD,CAAC;YACJ,CAAC;YAED,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;gBAC/B,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;YACtB,CAAC;YAED,IAAI,OAAO,GAAG,QAAQ,GAAG,CAAC,EAAE,CAAC;gBAC3B,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;YACxB,CAAC;QACH,CAAC;QAED,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC;QACrE,MAAM,YAAY,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACrF,MAAM,UAAU,GAAG,uBAAuB,CAAC;YACzC,OAAO,EAAE,OAAO;YAChB,WAAW,EAAE,YAAY;YACzB,WAAW,EAAE,YAAY;SAC1B,CAAC,CAAC;QAEH,IAAI,UAAU,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YACpC,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;QACtB,CAAC;QAED,IAAI,YAAY,IAAI,cAAc,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC;YACrD,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,IAAI,EAAE,aAAa;gBACnB,OAAO,EAAE,uEAAuE;aACjF,CAAC;QACJ,CAAC;QAED,OAAO;YACL,EAAE,EAAE,KAAK;YACT,IAAI,EAAE,eAAe;YACrB,OAAO,EAAE,mEAAmE;SAC7E,CAAC;IACJ,CAAC;CACF"}
1
+ {"version":3,"file":"codex-resume.js","sourceRoot":"","sources":["../../src/adapters/codex-resume.ts"],"names":[],"mappings":"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"}
@@ -22,6 +22,7 @@ export declare class CodexRuntimeAdapter implements RuntimeAdapter {
22
22
  private readThreadIdByPid;
23
23
  private sleep;
24
24
  private resolveHomeDirByPid;
25
+ private activityRelayPath?;
25
26
  constructor(deps: {
26
27
  tmux: TmuxAdapter;
27
28
  fsOps: CodexAdapterFsOps;
@@ -33,6 +34,7 @@ export declare class CodexRuntimeAdapter implements RuntimeAdapter {
33
34
  readThreadIdByPid?: (pid: number) => string | undefined;
34
35
  resolveHomeDirByPid?: ResolveHomeDirByPid;
35
36
  sleep?: (ms: number) => Promise<void>;
37
+ activityRelayPath?: string;
36
38
  });
37
39
  /**
38
40
  * plugin-primitive Phase 3a slice 3.5 — ensure Codex feature flag.
@@ -46,7 +48,39 @@ export declare class CodexRuntimeAdapter implements RuntimeAdapter {
46
48
  * that lived inside the auto-injected activity-hook provisioning path
47
49
  * pre-rip (plugin-primitive Phase 3a slice 3.1).
48
50
  */
49
- ensureCodexFeatureFlag(enabled: boolean): void;
51
+ ensureCodexFeatureFlag(enabled: boolean, opts?: {
52
+ codexVersion?: string;
53
+ }): void;
54
+ /**
55
+ * OPR.0.4.1.10 FR-A — write the OpenRig activity hooks into Codex's config layer
56
+ * (`~/.codex/config.toml` inline `[hooks]`) so an OpenRig-launched Codex seat is
57
+ * hook-PRIMARY from clean shipped config. Idempotent managed-block upsert for the
58
+ * four events SessionStart / UserPromptSubmit / Stop / PermissionRequest; each
59
+ * command is `node "<activityRelayPath>"` (the daemon's OWN shipped relay, FR-B —
60
+ * cwd-independent, version-matched, NOT `${PLUGIN_ROOT}` nor a per-cwd copy). Also
61
+ * pins `[features].hooks = true` (canonical key; the deprecated `codex_hooks` alias
62
+ * is intentionally NOT used here). Trust is granted at launch by the hook_trust_gate
63
+ * auto-clear (dismissCodexInteractiveGates → "2" Trust all and continue, verified on
64
+ * Codex 0.139). The relay inherits the seat's OPENRIG_* env from the tmux session.
65
+ *
66
+ * Fail-safe: skips + warns when the relay asset is missing — never writes a hook that
67
+ * points at a nonexistent script. Verified-firsthand (Codex 0.139, dev1-qa AC-2 proof):
68
+ * on the OpenRig-managed launch path — managed inline hooks + trusted + the relay env
69
+ * delivered into the seat (OPENRIG_URL + OPENRIG_ACTIVITY_HOOK_TOKEN + session/node/runtime)
70
+ * — all four events, SessionStart included, deliver as runtime_hook activity. Without the
71
+ * relay env the hooks are still trusted/visible but no activity rows land. (A bare/manual
72
+ * codex TUI launch lacks that context and may not deliver SessionStart — not how OpenRig
73
+ * launches seats.)
74
+ */
75
+ ensureCodexActivityHooks(): void;
76
+ /**
77
+ * OPR.0.4.1.10 B3 — durable disable. When runtime.codex.hooks_enabled is false, strip the
78
+ * OpenRig-managed activity-hooks sentinel block from ~/.codex/config.toml so a seat that was
79
+ * previously provisioned with hooks does not keep firing them after the operator disables.
80
+ * Removes ONLY the managed block — preserves any user-owned hooks and leaves [features].hooks
81
+ * (the Codex 0.139 default) intact. Idempotent; no-op when the config or the block is absent.
82
+ */
83
+ removeCodexActivityHooks(): void;
50
84
  listInstalled(binding: NodeBinding): Promise<InstalledResource[]>;
51
85
  project(plan: ProjectionPlan, binding: NodeBinding): Promise<ProjectionResult>;
52
86
  deliverStartup(files: ResolvedStartupFile[], binding: NodeBinding): Promise<StartupDeliveryResult>;
@@ -58,6 +92,7 @@ export declare class CodexRuntimeAdapter implements RuntimeAdapter {
58
92
  private buildQueueStateAddDirArg;
59
93
  checkReady(binding: NodeBinding): Promise<ReadinessResult>;
60
94
  private dismissSkippableCodexUpdatePrompt;
95
+ private dismissCodexInteractiveGates;
61
96
  ensureManagedBootstrap(binding: {
62
97
  cwd?: string | null;
63
98
  }): void;
@@ -82,4 +117,5 @@ export declare class CodexRuntimeAdapter implements RuntimeAdapter {
82
117
  private findCodexDescendantPids;
83
118
  private readThreadIdFromLogs;
84
119
  }
120
+ export declare function isCodex013xOrLater(version: string): boolean;
85
121
  //# sourceMappingURL=codex-runtime-adapter.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"codex-runtime-adapter.d.ts","sourceRoot":"","sources":["../../src/adapters/codex-runtime-adapter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"codex-runtime-adapter.d.ts","sourceRoot":"","sources":["../../src/adapters/codex-runtime-adapter.ts"],"names":[],"mappings":"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"}